package com.library.utils;

import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by wdl on 2015/12/13.
 * 数据库管理类，主要实现多线程操作数据库
 * 原因：既然我们只有一个数据库连接，Thread1 和 Thread2 对方法 getDatabase() 的调用就会取得一样的 SQLiteDatabase 对象实例。之后的事情就是，
 * 当 Thread1 尝试管理数据库连接时，Thread2 却仍然在使用该数据库连接。这也就是导致 IllegalStateException 崩毁的原因。
 * 实现原理：在方法里面，内置一个标志数据库被打开多少次的计数器。如果计数为1，代表我们需要打开一个新的数据库连接，否则，数据库连接已经存在。
 * 在方法 closeDatabase() 中，情况也一样。每次我们调用 closeDatabase() 方法，计数器都会递减，直到计数为0，我们就需要关闭数据库连接了。
 */
public class DatabaseManager {
    private AtomicInteger mOpenCounter = new AtomicInteger();

    private static DatabaseManager instance;
    private static SQLiteOpenHelper mDatabaseHelper;
    private SQLiteDatabase mDatabase;

    private static boolean isInit = false; // 是否已经初始化

    public static boolean isInit() {
        return isInit;
    }

    public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
        if (instance == null) {
            instance = new DatabaseManager();
            mDatabaseHelper = helper;
            isInit = true;
        }
    }

    public static synchronized DatabaseManager getInstance() {
        if (instance == null) {
            throw new IllegalStateException(
                    DatabaseManager.class.getSimpleName()
                            + " is not initialized, call initializeInstance(..) method first.");
        }

        return instance;
    }

    public synchronized SQLiteDatabase openDatabase() {
        if (mOpenCounter.incrementAndGet() == 1) {
            // Opening new database
            mDatabase = mDatabaseHelper.getWritableDatabase();
        }
        return mDatabase;
    }

    public synchronized void closeDatabase() {
        if (mOpenCounter.decrementAndGet() == 0) {
            // Closing database
            mDatabase.close();

        }
    }
}
